package com.itlong.cloud.commons.dao;

import com.itlong.cloud.POJO.PO.DeviceBusinessEntranceChangeLogPO;
import com.itlong.cloud.POJO.PO.DeviceEntranceInfoPO;
import com.itlong.cloud.POJO.PO.PushCloudEntranceChangeLogPO;
import com.itlong.cloud.POJO.VO.app.AppCloudIntercomsVO;
import com.itlong.cloud.POJO.VO.common.CloudEntranceVO;
import com.itlong.cloud.POJO.VO.property.*;
import com.itlong.cloud.POJO.VO.property.CloudElevatorByBuildIdVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <desc>
 *      云门禁数据访问接口
 * </desc>
 *
 * @createDate 2019/02/21
 */
@Mapper
@Repository
public interface ICloudEntranceDao {
    /**
     * <desc>
     *      获取电梯绑定关系
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @authro Jiaqi.X
     * @createDate 2020/03/31
     */
    Map<String,Object> getBandElevatorInfo(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      检测门禁是否存在
     * </desc>
     *
     * @param deviceUniques
     * @return
     * @author Jiaqi.X
     * @createDate 2019/02/21
     */
    String checkSnExists(@Param("deviceUniques") List<String> deviceUniques);

    /**
     * <desc>
     *      检测云联动器是否存在
     * </desc>
     *
     * @param deviceUniques
     * @return
     * @author Juguang.S
     * @createDate 2019/05/26
     */
    String checkSnExistsByWippen(@Param("deviceUniques") List<String> deviceUniques);

    /**
     * <desc>
     *      检测一体式人脸识别门禁是否存在
     * </desc>
     *
     * @param deviceUniques
     * @return
     * @author Qiang.S
     * @createDate 2020/05/26
     */
    String checkSnExistsByUnibodyFace(@Param("deviceUniques") List<String> deviceUniques);

    /**
     * <desc>
     *      检测一体式门禁是否存在
     * </desc>
     *
     * @param deviceUniques
     * @return
     * @author Juguang.S
     * @createDate 2020/12/11
     */
    String checkSnExistsByUnibodyEntrance(@Param("deviceUniques") List<String> deviceUniques);

    /**
     * <desc>
     *      登录
     * </desc>
     *
     * @param deviceUniques
     * @return
     * @author Jiaqi.X
     * @createDate 2019/02/22
     */
    CloudEntranceVO login(@Param("deviceUniques") List<String> deviceUniques);

    /**
     * <desc>
     *      只用于一体式门禁登录
     * </desc>
     *
     * @param deviceUniques
     * @return
     * @author caoshuai
     * @createDate 2019/02/22
     */
    CloudEntranceVO login1(@Param("deviceUniques") List<String> deviceUniques);

    /**
     * <desc>
     *      根据deviceUniques集合获取云电梯设备缓存实体信息
     * </desc>
     *
     * @param deviceUniques
     * @return
     * @author Juguang.S
     * @createDate 2019/02/26
     */
    CloudEntranceVO getDeviceInfoBySn(@Param("deviceUniques") List<String> deviceUniques);

    /**
     * <desc>
     *      获取待处理的推送指令
     * </desc>
     *
     * @author wangzhi
     * @createDate 2019/02/26
     */
    List<DeviceBusinessEntranceChangeLogPO> getPendingBusiness(@Param("projectId") String projectId, @Param("type") Integer type);

    /**
     * <desc>
     *      通过项目id获取所有云门禁设备
     * </desc>
     * @param projectId 项目id
     * @return 所有云门禁设备
     * @author wangzhi
     * @createDate 2019/02/27
     */
    List<DeviceEntranceInfoPO> getCloudEntranceByProjectId(@Param("projectId") String projectId);

    /**
     * <desc>
     *      通过项目id获取所有一体式人脸识别门禁设备
     * </desc>
     * @param projectId 项目id
     * @return 所有云门禁设备
     * @author Qiang.S
     * @createDate 2020/06/01
     */
    List<DeviceEntranceInfoPO> getCloudUnibodyEntranceByProjectId(@Param("projectId") String projectId);

    /**
     * <desc>
     *      根据项目id和类型更新同步状态
     * </desc>
     *
     * @param projectId 项目id
     * @author wangzhi
     * @createDate 2019/02/27
     */
    Integer updateBusinessStatusFull(@Param("projectId") String projectId);

    /**
     * <desc>
     *      根据主键id更新同步状态
     * </desc>
     *
     * @param busId 主键id列表
     * @author wangzhi
     * @createDate 2019/02/27
     */
    Integer updateBusinessStatusByIds(List<String> busId);

    /**
     * <desc>
     *      根据项目id和类型更新同步状态
     * </desc>
     *
     * @author wangzhi
     * @createDate 2019/02/27
     */
    Integer updateBusinessStatusSuccessByProjectAndType(@Param("projectId") String projectId,@Param("type") Integer type);

    /**
     * <desc>
     *      根据buildId查询门禁设备
     * </desc>
     *
     * @author wangzhi
     * @createDate 2019/02/27
     */
    List<CloudElevatorByBuildIdVO> getCloudEntranceByBuildId(Set<String> buildSet);

    /**
     * <desc>
     *      根据deviceUnique查询门禁设备
     * </desc>
     *
     * @author wangzhi
     * @createDate 2019/02/27
     */
    DeviceEntranceInfoPO getDeviceInfoByDeviceUnique(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      保存
     * </desc>
     *
     * @param map 保存参数集
     * @author wangzhi
     * @createDate 2019/02/28
     */
    Integer save(Map<String, Object> map);

    /**
     * <desc>
     *      获取云门禁轮询业务指令
     * </desc>
     *
     * @param params
     * @return
     * @author Qiang.S
     * @createDate 2019/03/04
     */
    List<CloudEntranceChangeLogPageVO> getChangeLogPage(Map<String,Object> params);

    /**
     * <desc>
     *      获取云门禁轮询业务指令总数
     * </desc>
     *
     * @param sn
     * @return
     * @author Qiang.S
     * @createDate 2019/03/04
     */
    Integer getChangeLogPageCount(String sn);

    /**
     * <desc>
     *      批量完成轮询命令
     * <desc/>
     *
     * @param sn
     * @param ids 轮询命令id列表
     * @param status 状态，0-待处理，1-处理中，2-处理完
     * @return
     * @author Qiang.S
     * @createDate 2019/03/04
     */
    Integer changeChangeLogOrdersStatus(@Param("sn") String sn,
                                        @Param("ids") String[] ids,
                                        @Param("status") Integer status);

    /**
     * <desc>
     *      通知云端升级失败原因
     * <desc/>
     *
     * @param sn
     * @param id 轮询命令id列表
     * @param status 状态，0-待处理，1-处理中，2-处理完，3-处理失败
     * @param msg 失败原因
     * @return
     * @author Qiang.S
     * @createDate 2019/03/04
     */
    Integer reportUpdateResult(@Param("sn") String sn,
                               @Param("id") String id,
                               @Param("status") Integer status,
                               @Param("msg") String msg);

    /**
     *      清除轮询指令
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @author Jiaqi.X
     * @createDate 2019/03/04
     */
    Integer cleanOrders(@Param("deviceUniques") String[] deviceUnique);

    /**
     * <desc>
     *      获取iot门禁账号及关联的产品id
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @author Jiaqi.X
     * @createDate 2019/03/04
     */
    Map<String, Object> getMainDeviceUniqueAndProductKey(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      获取iot门禁账号及关联的产品id
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @author Jiaqi.X
     * @createDate 2019/03/04
     */
    List<Map<String, Object>> getMainDeviceUniqueAndProductKeyByProjectId(@Param("projectId") String projectId);

    /**
     * <desc>
     *      根据SN号云门禁设备更新相关指令
     * <desc/>
     *
     * @param sn
     * @return
     * @author Qiang.S
     * @createDate 2019-03-05
     */
    List<CloudIntercomChangeLogOrderVO> getUpdateDeviceInfo(@Param("sn") String sn);

    /**
     * <desc>
     *      判断sn存在性
     * <desc/>
     *
     * @param sn
     * @return
     * @author Juguang.S
     * @createDate 2019-03-07
     */
    Integer checkSnExist(@Param("sn") String sn);

    /**
     * <desc>
     *      根据设备唯一码集合获取设备机号和状态
     * </desc>
     *
     * @param deviceUniques
     * @return
     * @author Juguang.S
     * @createDate 2019/03/19
     */
    List<Map<String,String>> getBatchDeviceStatus(@Param("deviceUniques") List<String> deviceUniques);

    /**
     * <desc>
     *      获取用户项目房间下的云门禁设备信息
     * </desc>
     *
     * @param userId 用户id
     * @param projectId 项目id
     * @author wangzhi
     * @createDate 2019/04/29
     */
    List<AppCloudIntercomsVO> getUserClouds(@Param("userId") String userId, @Param("projectId") String projectId);

    /**
     * <desc>
     *      根据设备唯一码获取sn
     * </desc>
     *
     * @param deviceUnique 设备唯一码
     * @author wangzhi
     * @createDate 2019/04/29
     */
    String getSnByDeviceUnique(@Param("deviceUnique") String deviceUnique);


    /**
     * <desc>
     *      检查设备是否属于当前房间楼栋
     * </desc>
     *
     * @param deviceUnique    设备唯一码
     * @param roomId 房间id
     * @author wangzhi
     * @createDate 2019/04/29
     */
    Integer checkDeviceInRoom(@Param("deviceUnique") String deviceUnique,@Param("roomId") String roomId);

    /**
     * <desc>
     *      根据访客信息编号查询设备信息
     * </desc>
     *
     * @param vFaceId 百度中的人脸编号
     * @author wangzhi
     * @createDate 2019/04/29
     */
    List<PushCloudVisitorInfoDeviceVO> getVisitorDeviceInfo(String vFaceId);

    /**
     * <desc>
     *      分页查询某个云门禁设备服务的房间信息
     * <desc/>
     *
     * @param sn 设备sn
     * @param projectId 项目编号
     * @param offset limit分页偏移量
     * @param pageSize limit分页大小
     * @return
     * @author wangzhi
     * @createDate 2019/04/30
     */
    List<CloudEntranceDeviceAuthVO.Room> getServeRoomsPage(@Param("sn") List<String> sn,
                                                           @Param("projectId") String projectId,
                                                           @Param("offset") Integer offset,
                                                           @Param("pageSize") Integer pageSize);
    /**
     * <desc>
     *      获取某个云门禁设备服务的房间总数
     * <desc/>
     *
     * @param sn 设备sn
     * @param projectId 项目编号
     * @return
     * @author wangzhi
     * @createDate 2019/04/30
     */
    Integer getServeRoomsCount(@Param("sn") List<String> sn,
                               @Param("projectId") String projectId);

    /**
     * <desc>
     *      根据设备信息获取访客信息
     * </desc>
     *
     * @author wangzhi
     * @createDate 2019/04/30
     */
    List<CloudIntercomVisitorVO> getVisitorInfoByDevice(List<String> strings);

    /**
     * <desc>
     *      根据roomId和projectId去查找room的信息，含开门密码
     * </desc>
     *
     * @param roomId 房屋id
     * @param projectId 项目id
     * @return 房间信息map
     * @author wangzhi
     * @createDate 2019/05/05
     */
    Map<String,Object> getRoomInfo(@Param("roomId")String roomId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      根据roomId查找房间编号信息
     * </desc>
     *
     * @param roomId 房屋id
     * @return 房间信息map
     * @author wangzhi
     * @createDate 2019/05/05
     */
    Map<String,Object> getRoomNumByRoomId(@Param("roomId")String roomId);

    /**
     * <desc>
     *      通过iotproductKey获取云门禁的iot版本
     * </desc>
     *
     * @param iotProductKey
     * @return
     * @author Jiaqi.X
     * @createDate 2019/05/15
     */
    Integer getIotVersionByProductKey(@Param("iotProductKey") String iotProductKey);

    /**
     * <desc>
     *      查询门禁设备下的房间id集合
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @author Juguang.S
     * @createDate 2019/06/28
     */
    String getRoomInfoByEntrance(@Param("deviceUnique")String deviceUnique);


    /**
     * <desc>
     *      获取设备地址
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/11
     */
    Map<String,Object> getDeviceAddress(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *       根据设备号获取设备信息
     * </desc>
     *
     * @param
     * @return
     * @author caoshuai
     * @createDate 2020/11/23 17:22
     */
    DeviceEntranceInfoPO getEntranceInfoByDeviceUnique(@Param("deviceUnique") String deviceUnique);
}
